package com.example.demo1;


import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 案例一：查找幸存者(面向过程)
 */
public class Test2 {
    public static void main(String[] args) {
        // 1.创建一个集合存储100个囚犯的编号
        List<Integer> peoples = new ArrayList<>();

        // 2.循环100次添加1-200之间不重复的编号到这个集合中去
        Random r = new Random();
        for (int i = 1; i <= 10; i++) {
            int code = r.nextInt(10) + 1;
            // 3.判断是否已经存在,如果存在,重新生成,直到不存在为止
            if (peoples.contains(code)) {
                i--;
            } else {
                peoples.add(code);
            }
        }

        System.out.println(peoples);

        // 注意：在删除之前把原来集合的数据备份
        List<Integer> backup = new ArrayList<>(peoples);
        backup.addAll(peoples);

        // 4.删除奇数位置的人,从集合的后面开始删除
        while (peoples.size() > 1) {
            // 5.注意开始删除的位置是有讲究的,如果当前集合的长度是偶数,此时删除的位置是集合的长度-2,如果集合的长度是奇数,此时删除的位置是集合的长度-1
            // 因为集合的索引是从0开始的 假设集合的长度是6 size - 1 = 5 5对应集合的位置就是集合的最后一个元素,因为所以是从0开始删除的
            // 因此当集合的长度是偶数的时候需减的是2 奇数长度的时候减的是1
            // peoples = [1 , 2, 3, 4, 5, 6]
            //                         i
            // peoples = [1 , 2, 3, 4, 5]
            //                         i
            for (int i = peoples.size() % 2 == 0 ? peoples.size() - 2 : peoples.size() - 1; i >= 0; i -= 2) {
                peoples.remove(i);
            }
        }

        // 6.循环结束后输出最后剩下的人的编号
        Integer code = peoples.get(0);

        // 7.把备份集合中找到幸存者的位置
        System.out.println("幸存者位置：" + backup.indexOf(code) + 1);
    }
}
